הסבר איך ליצור סביבת פיתוח אישית שעובדת על בסיס MVC.
בזמן האחרון עבדתי על Framework משלי , אז החלטתי לשתף במדריך על בניית MVC Framework פשוט
בחלק הראשון של המדריך אני יסביר את המבנה הבסיסי של התיקיות ויציג איך עובד הMVC.
בתור התחלה נסביר על MVC:
(מתוך ויקיפדיה)
תבנית Model-View-Controller (בקיצור MVC) היא תבנית עיצוב בהנדסת תוכנה המשמשת להפשטת יישום כלשהו. התבנית מתארת טכניקה לחלוקת היישום לשלושה חלקים, מודל, מבט ובקר, המחוברים ביניהם בצימוד רפוי מונחה אירועים. בדרך זו, התלות הדדית בין ממשק המשתמש לשאר חלקי התוכנה פוחתת, ואת החלקים השונים ניתן לפתח באופן בלתי-תלוי. בנוסף, קל יותר לתחזק את התוכנה וכן לעשות שימוש חוזר בחלקי היישום שהופרדו.
מבנה הMVC:
הקבצים שצריך:
הסבר על קבצים ותיקיות:
application-שומר קבצים של היישום (אין גישה למשתמש)
models-אחרי על בדיקת טפסים ועבודה אם מסד נתונים.
views-קבצי תצוגה של המערכת.
controllers-מבצע ניתובים בין המודלים לתצוגות וההפך.
public-שומר קבצים שניתנים לגישה לכלל המשתמשים.
התת תיקיות כאן מאוד מובנות קבצי CSS,JS,תמונות,FLASH,קבצים שהמשתמש מעלה וכו'.
temp-קבצים שהמערכת יוצרת לדוגמה log,cache וכו'.
library-התיקיה הכי חשובה בעצם זאת ליבת המערכת.
תיקית framework-כל המחלקות שאחריות על הפעולה נמצאות בא
controller.php-מחלקה שכל הקונטרוליירים שלנו יורישו
view.php-מחלקה שאחריאית על המראה
model.php-מחלקה שהמודלים יורישו
Bootstrap.php-קובץ שמריץ את הMVC
index.php-קובץ הרצת המערכת הוא מפעיל את הBootstrap.php
.htaccess-קובץ שהיתן קצת מראה יפה יותר לכתובת האתר.
אוקי אז עכשיו לעבודה:
index.php
<?php
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', __DIR__);
//require the bootfile
require_once ROOT.DS.'library'.DS.'Bootstrap.php';
//boot the appliction
$appliction = new Bootstrap();
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', __DIR__);
//require the bootfile
require_once ROOT.DS.'library'.DS.'Bootstrap.php';
//boot the appliction
$appliction = new Bootstrap();
אין כאן יותר מידי מה להסביר פשוט מריץ את האפליקציה
Bootstrap.php
<?php
class Bootstrap {
/*
* this function get url and run the aplliction with
* controller and action
*/
function __construct() {
/*
* autoloader run framework files
*/
spl_autoload_register(array($this, 'loader'));
/*
* @param array $url
* @param string $url[0] controller
* @param string $url[1] action
*/
$url = isset($_GET['url']) ? $_GET['url'] : null; //cheak if isset url
$url = rtrim($url, "/"); //remove over slashs (/)
$url = explode("/", $url); //explode by slash to controller and action
if (empty($url[0])) {
//if url empty the boot run default controller
$this->runController("main");
return FALSE;
}
if (isset($url[1]))
//if action set run controller and use action
$this->runController($url[0], $url[1]);
else
//else action not set run controller only
$this->runController($url[0]);
}
/*
* @param string $name function or class name
* this function load the file with class or functions
*/
private function loader($name) {
//file dir and name
$file = ROOT . DS . 'library' . DS . "SiDoX" . DS .
str_replace("Sidox_", null, $name) . ".php";
//cheak if file exist
if (file_exists($file))
require($file); //file require
}
/*
* @param string $name controller name
* @param string $method method name
*/
function runController($name, $method = NULL) {
/*
* cheak if controller exists
* TRUE:(controller not exists)
* run diagnostics
* go to error page -> move to default page
*/
$Controller = ucfirst($name) . "Controller";
$dirController = APPLICATION . 'controllers' . DS .
$Controller . '.php';
if (!(file_exists($dirController))) {
//if file not exists it's 404 page
echo "404"; //you can make 404 page controller or header...
return FALSE;
}
/*
* run contoller
*/
require $dirController;
$Controller = new $Controller;
//cheak if meathod exists
if (!(method_exists($Controller, $method)))
$method = "Main"; //method not exist set defualt
$Controller->{$method}(); //run action
}
}
class Bootstrap {
/*
* this function get url and run the aplliction with
* controller and action
*/
function __construct() {
/*
* autoloader run framework files
*/
spl_autoload_register(array($this, 'loader'));
/*
* @param array $url
* @param string $url[0] controller
* @param string $url[1] action
*/
$url = isset($_GET['url']) ? $_GET['url'] : null; //cheak if isset url
$url = rtrim($url, "/"); //remove over slashs (/)
$url = explode("/", $url); //explode by slash to controller and action
if (empty($url[0])) {
//if url empty the boot run default controller
$this->runController("main");
return FALSE;
}
if (isset($url[1]))
//if action set run controller and use action
$this->runController($url[0], $url[1]);
else
//else action not set run controller only
$this->runController($url[0]);
}
/*
* @param string $name function or class name
* this function load the file with class or functions
*/
private function loader($name) {
//file dir and name
$file = ROOT . DS . 'library' . DS . "SiDoX" . DS .
str_replace("Sidox_", null, $name) . ".php";
//cheak if file exist
if (file_exists($file))
require($file); //file require
}
/*
* @param string $name controller name
* @param string $method method name
*/
function runController($name, $method = NULL) {
/*
* cheak if controller exists
* TRUE:(controller not exists)
* run diagnostics
* go to error page -> move to default page
*/
$Controller = ucfirst($name) . "Controller";
$dirController = APPLICATION . 'controllers' . DS .
$Controller . '.php';
if (!(file_exists($dirController))) {
//if file not exists it's 404 page
echo "404"; //you can make 404 page controller or header...
return FALSE;
}
/*
* run contoller
*/
require $dirController;
$Controller = new $Controller;
//cheak if meathod exists
if (!(method_exists($Controller, $method)))
$method = "Main"; //method not exist set defualt
$Controller->{$method}(); //run action
}
}
הקובץ הזה אחרי על עיבוד הקלט שמתקבל בשורת הכתובת (GET)
ואז הוא מבצע ניתוב לcontroller הרצוי ולaction
כידי להיכנס לcontroller צריך להקליד בשורת הכתובות:
index.php?url=Controller/Action
טוב עכשיו אם הbootstrap סיימנו
וכרגע אם אנחנו ניצור קובץ בנתיב appliction/controllers/MainController.php
ונכתוב מחלקה כזאת:
<?php
class MainController{
public function Main(){
echo "it's your main controller";
}
}
class MainController{
public function Main(){
echo "it's your main controller";
}
}
משאנחנו רוצים שיקרה שהקונטרולייר שיצרנו יוריש ממחלקת controller
ויוכל לבצע שימוש בכל מיני כלים שמוגדרים במערכת אם זה מחלקת הVIEW או כל כלי אחר שנוסיף בהמשך
על זה אני יסביר בחלק הבא
תגובות לכתבה:
מדריך מגניב. תודה :)
יש מקומות שאפשר לשפר בהם את רמת הקוד, אבל הרעיון והמימוש של הפרינציפ נכון.
יש מה ללמוד מהמדריך ואפשר להבין ממנו איך בדיוק הפריימוורקים הגדולים עושים את אותן הפעולות.
זה כל הרעיון שאני מנשה להסביר ממש בסיסית וכל שיפור וכל רעיון חדש המשתמש עצמו יוסיף לפי הנוחות שלו.
עבודה יפה, תודה